import axios from "axios";
import store from "@/store";
// 基准路径
import router from '../router'
import { removeToken } from './auth'

/* const baseURL = 'http://ihrm-java.itheima.net/api/' */
//假地址
/* const baseURL = '/dev-api' */

// const baseURL = 'http://ihrm-java.itheima.net/api/'

// 通过process.env.环境变量名称（名称自定义）
// process.env是Node.js的API
export const baseURL = process.env.VUE_APP_BASE_API

const service = axios.create({
    baseURL: baseURL
})


// 请求拦截器
service.interceptors.request.use(config => {
    // 统一添加请求头，如果有token就添加请求头Authorization
    const token = store.getters.token

    if (token) {
        config.headers = {
            Authorization: 'Bearer ' + token
        }
    }
    return config
}, err => {
    // 对请求错误做些什么
    return Promise.reject(err)
})



//响应拦截
service.interceptors.response.use(res => {
        return res.data
    }, (err) => {
        // 处理token失效的问题
        if (err.response.status === 401 && err.response.data.code === 10002) {
            // token已经失效；删除vuex中的token；删除本地缓存中的token，删除用户信息；跳转到登录页面
            store.commit('user/SET_TOKEN', '')
                // 删除本地缓存的token
            removeToken()
                // 删除用户信息
            store.commit('user/clearInfo')
                // 跳转到登录页面
            router.push('/login')
        }
        return Promise.reject(err)
        return Promise.reject(err)
    })
    //自定义函数封装通用调接口的方法：支持固定的data传参
    //知识点：1.传输传递返回值 2.参数如何使用，具体的发送请求的过程，与axios有关
    /* export default (options) => {
        return service({
            url: options.url,
            //默认请求方式是GET
            method: options.method || 'GET',
            //如果请求方式是GET就是有params属性传递参数，其他方法使用data属性传递参数
            //service中的是对象格式 键 ：值  成对出现
            //Es6的规则：对象的键key可以是动态的
            //toUpperCase()字符串转为大写
            [options.method.toUpperCase() === 'GET' ? 'params' : 'data']: options.data //【】里面是解构形式+三元表达式
        }) */

//优化完整写法  目的支持默认请求方式为get(调用接口的时候不传递method属性)
export default (options) => {
    let key = ''
    if (options.method) {
        key = options.method.toUpperCase() === 'GET' ? 'params' : 'data'
    } else {
        key = 'params'
    }
    return service({
        url: options.url,
        //默认请求方式是GET
        method: options.method || 'GET',
        //如果请求方式是GET就是有params属性传递参数，其他方法使用data属性传递参数
        //service中的是对象格式 键 ：值  成对出现
        //Es6的规则：对象的键key可以是动态的
        //toUpperCase()字符串转为大写
        [key]: options.data
    })
}







































































/* import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
 */
// create an axios instance
/* const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
}) */

// request interceptor
/* service.interceptors.request.use(
  config => { */
// do something before request is sent

/*  if (store.getters.token) { */
// let each request carry token
// ['X-Token'] is a custom headers key
// please modify it according to the actual situation
/*    config.headers['X-Token'] = getToken()
    }
    return config
  },
  error => { */
// do something with request error
/*     console.log(error) // for debug
    return Promise.reject(error)
  }
) */

// response interceptor
/* service.interceptors.response.use( */
/**
 * If you want to get http information such as headers or status
 * Please return  response => response
 */

/**
 * Determine the request status by custom code
 * Here is just an example
 * You can also judge the status by HTTP Status Code
 */
/*  response => {
   const res = response.data

   // if the custom code is not 20000, it is judged as an error.
   if (res.code !== 20000) {
     Message({
       message: res.message || 'Error',
       type: 'error',
       duration: 5 * 1000
     })

     // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
     if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
       // to re-login
       MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
         confirmButtonText: 'Re-Login',
         cancelButtonText: 'Cancel',
         type: 'warning'
       }).then(() => {
         store.dispatch('user/resetToken').then(() => {
           location.reload()
         })
       })
     }
     return Promise.reject(new Error(res.message || 'Error'))
   } else {
     return res
   }
 },
 error => {
   console.log('err' + error) // for debug
   Message({
     message: error.message,
     type: 'error',
     duration: 5 * 1000
   })
   return Promise.reject(error)
 } */
/* ) */

/* export default service */